<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // yield表达式本身没有返回值，或者说总是返回undefined. next方法可以带一个参数，
      // 该参数就会被当做上一个yeild表达式的返回值
      function* f() {
        for (var i = 0; true; i++) {
          var reset = yield i;
          if (reset) {
            i = -1;
          }
        }
      }
      var g = f();
      g.next(); // { value: 0, done: false }
      g.next(); // { value: 1, done: false }
      g.next(true); // { value: 0, done: false }
      /**
       * 上面代码先定义了一个可以无限运行的 Generator 函数f，如果next方法没有参数，每次运行到yield表达式，变量reset的值总是undefined。
       * 当next方法带一个参数true时，变量reset就被重置为这个参数（即true），因此i会等于-1，下一轮循环就会从-1开始递增。
       */

      function* foo(x) {
        var y = 2 * (yield x + 1);
        var z = yield y / 3;
        return x + y + z;
      }

      var a = foo(5);
      a.next(); // Object{value:6, done:false}
      a.next(); // Object{value:NaN, done:false}
      a.next(); // Object{value:NaN, done:true}

      var b = foo(5);
      b.next(); // { value:6, done:false }
      b.next(12); // { value:8, done:false }
      b.next(13); // { value:42, done:true }
    </script>
  </body>
</html>
